/**
  * clasa skupiajaca wszytkie wlasciwosci obrazka szukanego
 * 1. konstruktor - String n, BufferedImage imgtemp
 * @param imgtemp szukany obrazek
 *
 */
package A002_Obrazek;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import Linki._A_Path;

//import DaneObrazka.WczytajObrazki;

/**
 * @author Tomek2
 *
 */
public class _A_DaneObrazka  {
	// dane do obrazu
	public String _NazwaObrazu; // nazwa elemntu szukanego
	public int _PunktDoZnalezienia;
	public boolean _Konwertowac;
	
	
	
	//public int iLiczbaObjektowDoZnalezienia;
	public BufferedImage _obrazek; // oryginalny obrazek .bmp
	public int widthOb; // szerokosc obrazka
	public int heightOb; // wysokosc obrazka
	public int _typObrazka; // typ obrazka
	
	public BufferedImage _filtr; // obraz bezposrednio po filtrowaniu / przed cropem
	public BufferedImage _filtrCrop; // obrazek po kropowaniu
	
	public int [][] _obraz2D;	// filtr zamieniony na int tablce po kropowaniu
	public int [] _obraz1D; // filtr zamieniony na int 1D tablce po kropowaniu
	public int widthINT;
	public int heightINT;
	
	public int tolerancja;
	public int _PW; //wartosc pierwszego pixela
	public int _OW; //wartosc otatniego pixela
	public int startX, startY; //pierwszy pixel
	public int startX2, startY2;//ostatni pixel
	public int _sumaKontrolanPix; //Suma kontrolna po cropwaniu pixeli pełnych ( nie -1 )

	public int korektaX;//korekta pozycji naciku np kursora
	public int korektaY;
	
	/**
	 * @param name
	 * @param Pathobrazek
	 * @param tolerancja

	 * @param iloscDoZnalezienia
	 * @throws Exception
	 * 1. konwertuje oryginalny obrazek na nieparzyste wartosci
	 * 2. kopiuje obrazek
	 * 3. ustawia srednia filtru i go tworzy
	 * 4. crop
	 * 5. Ustawi pierwszy i ostatni pixel do przyspieszenia findera
	 * 5 .iSumaKontrolnaPix - suma kontrolna pix fo findera
	 * 6 . conversja 2 D to 1 D
	 */


	/**
	 * @param NazwaObrazu - Nazwa obrazu
	 * @param SciezkaDoObrazu - Sciezka do pobrania obrazu
	 * @param Konwerowac - czy szykany obraz ma byc upraszczany
	 * 						jesli tak to TRUE
	 * @param ZnajdzPunkt - 1 Default jesli null - Srodek Obrazu
	 * 						2 Lewy gorny rog obrazu
	 * 						3 Prawy Gorny rog obrazu
	 * 						4 Lewy dolny rog obrazu
	 * 						5 Prawy dolny rog obrazu
	 * @throws Exception
	 */
	public _A_DaneObrazka(
			String NazwaObrazu, 
			String SciezkaDoObrazu, 
			boolean Konwerowac, 
			int ZnajdzPunkt ) 
					throws Exception {
		this._NazwaObrazu = NazwaObrazu;
		this._Konwertowac = Konwerowac;
		
		if (ZnajdzPunkt <  1 || ZnajdzPunkt >  5) 
			ZnajdzPunkt = 1;
		else 
			this._PunktDoZnalezienia = ZnajdzPunkt;
		
		// wczytanie obraka
		try {
			this._obrazek = ImageIO.read(new File(SciezkaDoObrazu));
		} catch (IOException e) {
			System.err.println("BRAK OBRAZKA buffered image informacja z _A_DaneObrazka");
		}
		 
		this.widthOb = _obrazek.getWidth();
		this.heightOb = _obrazek.getHeight();
		this._typObrazka = _obrazek.getType();
		
		this._filtr = null;

		this.tolerancja = ENUM_obrazki.valueOf(this._NazwaObrazu).tolerancja();
		System.err.println("Tolerancja" + this.tolerancja);
		//1-moze niepotrzebne
		//new _D_KonwertBuffnaNieparzyste (this); //1
		
		this._obraz2D = new int[this.widthOb][this.heightOb];
		
		_filtr = KopiujObraz(_obrazek); //2
		new _E_UstawSredniaFiltru2 (this._filtr, this._obrazek, this._Konwertowac); //3
		
		_filtrCrop = crop(_filtr);//4
		
		ustalKrance(this._filtrCrop, this.startX, this.startY, this._PW,
				this.startX2, this.startY2, this._OW);
				
		_sumaKontrolanPix = _sumaKontrolnaPix(_filtrCrop); // 5
		
		//this._obraz1D = convert2Ddo1D (_obraz2D); //6
			
		
		//zapis na dysku filtra dla testow =============>
		//zapiszobraz();
	}
	
	

	private BufferedImage KopiujObraz(BufferedImage _ob) {
		
			
		BufferedImage _tmp = new BufferedImage (_ob.getWidth(), _ob.getHeight(), _ob.getType());
			
			for (int y = 0 ; y < _ob.getHeight() ; y++){
				for (int x = 0 ; x < _ob.getWidth() ; x++){
					_tmp.setRGB(x, y, _ob.getRGB(x, y)); 
				}
			}
			
			return _tmp;
		
	}



	/**
	 * Wymazuje biale pola w okolo
	 * @param _filtr2 
	 * @return 
	 */
	private BufferedImage crop(BufferedImage _filtr2){
		int gora = 0;
		int lewa = 0;
		int prawa = 0;
		int dol = 0;
		
		//gorna belka
		skok:{
		for (int yG = 0; yG < _filtr2.getHeight(); yG++){
			for (int xL = 0; xL < _filtr2.getWidth(); xL++){
					if (_filtr2.getRGB(xL, yG) != -1){
						gora = yG;
						break skok;
					}
			}
		}
		}
		//Lewa Belka
		skok:{
		for (int xL = 0; xL < _filtr2.getWidth(); xL++){
			for (int yG = 0; yG < _filtr2.getHeight(); yG++){
					if (_filtr2.getRGB(xL, yG) != -1){
						lewa = xL;
						break skok;
					}
			}
		}
		}
		//dolna belka
		skok:{
		for (int yG = _filtr2.getHeight()-1; yG >= 0 ; yG--){
			for (int xL = _filtr2.getWidth()-1; xL >= 0 ; xL--){
					if (_filtr2.getRGB(xL, yG) != -1){
						dol = yG+1;
						break skok;
					}
			}
		}
		}
		//Prawa Belka
		skok:{
		for (int xL = _filtr2.getWidth()-1; xL >= 0; xL--){
			for (int yG = _filtr2.getHeight()-1; yG >= 0 ; yG--){
					if (_filtr2.getRGB(xL, yG) != -1){
						prawa = xL+1;
						break skok;
					}
			}
		}
		}
		//System.out.println("Lewa " + lewa + " Gora "+ gora +" Prawa " + prawa + " Dol " + dol);

		BufferedImage _tmpc = new BufferedImage(Math.abs(prawa-lewa), Math.abs(dol-gora), _typObrazka);

		for (int y = 0, y2 = gora; y < Math.abs(dol-gora); y++,y2++){
			for (int x = 0, x2 = lewa; x < Math.abs(prawa-lewa); x++, x2++){
				
				_tmpc.setRGB(x, y, _filtr2.getRGB(x2, y2));
			}
		}
		
		return _tmpc;
	}
	
	/**
	 * Utwaia pierwszy i ostatni punkt szukania
	 * koniecznie musi byc po kropowaniu
	 */
	private void ustalKrance (BufferedImage _filtrCrop, int x1, int y1, int PW, int x2, int y2, int OW){
		ex1:{
			for (int y = 0 ; y < _filtrCrop.getHeight() ; y++){
				for (int x = 0 ; x < _filtrCrop.getWidth() ; x++){
					System.out.println(x);
					if (_filtrCrop.getRGB(x, y) != -1){
						x1 = this.startX = x;
						y1 = this.startY = y;
						PW = this._PW = _filtrCrop.getRGB(x, y);
						break ex1;
					};
					
				}
			}
		}
		
		ex2:{
			for (int y = _filtrCrop.getHeight()-1 ; y >= 0 ; y--){
				for (int x = _filtrCrop.getWidth()-1 ; x >= 0 ; x--){
					
					if (_filtrCrop.getRGB(x, y) != -1){
						x2 = this.startX2 = x;
						y2 = this.startY2 = y;
						OW = this._OW =_filtrCrop.getRGB(x, y);
						break ex2;
					};
					
				}
			}
		}
	}
	
	
	private int _sumaKontrolnaPix(BufferedImage _buf) { // 5
		int _iPdoZ = 0;
		
		for (int y = 0;y < _buf.getHeight(); y++){
			for(int x = 0;x < _buf.getWidth(); x++){
				if (_buf.getRGB(x, y) != -1)_iPdoZ++;
			}
		}
		
		if (_iPdoZ==0) _iPdoZ = -1;
		return _iPdoZ; 
	}
	
	
	/*// zmiana z 2D do 1D
	private int [] convert2Ddo1D(int obraz2D[][]){

		//System.out.println("BuferedImage - Obrazek SZ-" + obraz2D.length +" W-"+ obraz2D[0].length);

		int[] obraz1D = new int [obraz2D.length * obraz2D[0].length];
		int lp = 0;
		for (int y = 0; y < obraz2D[0].length; y++){
			for ( int x = 0; x < obraz2D.length; x++){
				
				obraz1D[lp] = obraz2D[x][y];
				lp++;
			}
		}		 
		  return obraz1D;
	}*/
	
	
	private void zapiszobraz() {
		String path = _A_Path.iGlobalPath + _A_Path.iKatSys + "TestoweDaneObrazka/";
		
		try {
			ImageIO.write(this._obrazek, "bmp", new File(path + "001-" + this._NazwaObrazu +"_obrazek.bmp"));
			ImageIO.write(this._filtr, "bmp", new File(path + "002-" + this._NazwaObrazu +"_filtr.bmp"));
			ImageIO.write(this._filtrCrop, "bmp", new File(path + "003-" + this._NazwaObrazu +"_filtrCrop.bmp"));
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

	public String toString(){
		String st = "\nObrazek Szukany " +"\t" +this._NazwaObrazu + 
					"\nWielkosc filtruCrop \tW-" + _filtrCrop.getWidth() +" H-" + _filtrCrop.getHeight() + "\n" + 
					"Pierwszy Punkt \t\tX-Y..." + startX + "-" + startY + " _PW..." + _PW +"\n" +
					"Ostatni Punkt \t\tX2-Y2..." + startX2 + "-" + startY2 + " _OW..." + _OW  +
					"\nDo nalezienia\t\t" + this._sumaKontrolanPix + "\n\n\n";
		return st;
	}
}
